home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / artemis / artsrc2 / vector.h < prev    next >
C/C++ Source or Header  |  1994-06-01  |  5KB  |  112 lines

  1. /*
  2. *                Vector演算関数                ver 1.12
  3. *
  4. *    math.h, math2.h を仮定する。
  5. */
  6.  
  7. /*
  8. *        型宣言
  9. */
  10. struct vect2i { int x ; int y };                /* 二次元整数vector */ 
  11. struct vect3i { int x ; int y ; int z };        /* 三次元整数vector */ 
  12. struct vect3p { int x; int y ; int z };         /* 三次元固定少数vector */
  13. struct vect3f { float x ; float y ; float z };    /* 三次元浮動少数vector */
  14. struct matrix3i    { int xx ; int xy ; int xz ;
  15.                   int yx ; int yy ; int yz ;
  16.                   int zx ; int zy ; int zz ; };    /* 3×3整数行列 */
  17. struct matrix3p    { int xx ; int xy ; int xz ;
  18.                   int yx ; int yy ; int yz ;
  19.                   int zx ; int zy ; int zz ; };    /* 3×3固定少数行列 */
  20. struct surfi {
  21.     struct vect3i norl;                            /* 法線 (NORmal Line) */
  22.     struct vect3i s0;                            /* 面上の一点 */
  23.     int c;                                        /* 定数 */
  24. };
  25. struct surfp {
  26.     struct vect3p norl;                            /* 法線 (NORmal Line) */
  27.     struct vect3p s0;                            /* 面上の一点 */
  28.     int c;                                        /* 固定少数の定数 */
  29. };
  30.  
  31.  
  32.  
  33. /*
  34. *        固定少数整数変換関数
  35. */
  36. extern struct vect3i DeciToInt3V( struct vect3p p );
  37. extern struct vect3p IntToDeci3V( struct vect3i p );
  38. extern struct matrix3i DeciToInt3M( struct matrix3p A );
  39. extern struct matrix3p IntToDeci3M( struct matrix3i A );
  40. /*
  41. *        vector 演算関数
  42. */
  43. #define MakeZero2i( p )            { (p).x=0; (p).y=0; }
  44. #define MakeZero2p( p )            { (p).x=0; (p).y=0; }
  45. extern struct vect2i scalar2i( int, struct vect2i )    ;
  46. extern struct vect2i inscalar2i( int, struct vect2i );
  47. extern struct vect2i scalar2p( int, struct vect2i );
  48. extern struct vect2i add2i( struct vect2i, struct vect2i );
  49. extern struct vect2i subtr2i( struct vect2i, struct vect2i );
  50. extern struct vect2i rshift2i( struct vect2i, int );
  51. extern struct vect2i lshift2i( struct vect2i, int );
  52. #define iszero2( p )            ( (p).x==0 && (p).y==0 )
  53. #define abs2i( p )                ( (int)sqrt( (p).x*(p).x + (p).y*(p).y ) )
  54. #define innerpro2i( p, q )        ( (p).x*(q).x + (p).y*(q).y )
  55. #define innerpro2p( p, q )        AdjMulDeci( (p).x*(q).x + (p).y*(q).y )
  56. #define issame2v( p, q )        ( (p).x==(q).x && (p).y==(q).y )
  57.  
  58. #define MakeZero3i( p )            { (p).x=0; (p).y=0; (p).z=0; }
  59. #define MakeZero3p( p )            { (p).x=0; (p).y=0; (p).z=0; }
  60. extern struct vect3i scalar3i( int, struct vect3i );
  61. extern struct vect3i scalar3p( int, struct vect3i );
  62. extern struct vect3i inscalar3i( int, struct vect3i );
  63. extern struct vect3i add3i( struct vect3i, struct vect3i );
  64. extern struct vect3p add3p( struct vect3p x1, struct vect3p x2 );
  65. extern struct vect3i subtr3i( struct vect3i, struct vect3i );
  66. extern struct vect3p subtr3p( struct vect3p x1, struct vect3p x2 );
  67. extern struct vect3i outerpro3i( struct vect3i, struct vect3i );
  68. extern struct vect3p outerpro3p( struct vect3p x1, struct vect3p x2 );
  69. extern struct vect3i rshift3i( struct vect3i p, int i );
  70. extern struct vect3i lshift3i( struct vect3i p, int i );
  71. extern struct vect3p rshift3p( struct vect3p p, int i );
  72. extern struct vect3p lshift3p( struct vect3p p, int i );
  73. #define issame3v( p, q )        ( (p).x==(q).x && (p).y==(q).y && (p).z==(q).z )
  74. #define ispara3( p, q )            ( ( (p).x*(q).y - (p).y*(q).x )==0 && ( (p).x*(q).z - (p).z*(q).x )==0 && ( (p).y*(q).z - (p).z*(q).y )==0 )
  75. #define iszero3( p )            ( (p).x==0 && (p).y==0 && (p).z==0 )
  76. #define det3( p, q, r )            ( (p).x*(q).y*(r).z + (q).x*(r).y*(p).z + (r).x*(p).y*(q).z - (p).x*(r).y*(q).z - (q).x*(p).y*(r).z - (r).x*(q).y*(p).z )
  77. #define innerpro3i( p, q )        ( (p).x*(q).x + (p).y*(q).y + (p).z*(q).z )
  78. #define innerpro3p( p, q )        AdjMulDeci( (p).x*(q).x + (p).y*(q).y + (p).z*(q).z )
  79. #define abs3i( p )                ( (int)sqrt( (p).x*(p).x + (p).y*(p).y + (p).z*(p).z ) )
  80. #define Normalize3i( p )        { if( abs3i(p)>0 ) (p)=inscalar3i( abs3i(p) ,scalar3i( DUNIT, (p) ) );}
  81. /* p の大きさをdunitにする */
  82. #define cos3i( p, q )            ( (innerpro3i( p, q ) << DECIMAL) / abs3i(p) / abs3i(q) )
  83. /* p, q のなす角の cos を固定少数で返す */
  84. #define Init3V( p )                { (p).x=0 ; (p).y=0 ; (p).z=0 ;}
  85.  
  86. /*
  87. *        行列演算関数
  88. */
  89. extern struct matrix3i addm3i( struct matrix3i A, struct matrix3i B );
  90. #define addm3p( A, B )            ( addm3i( (A), (B) ) )
  91. extern struct matrix3i subm3i( struct matrix3i A, struct matrix3i B );
  92. #define subm3p( A, B )            ( subm3i( (A), (B) ) )
  93. extern struct matrix3i mulmm3i( struct matrix3i A, struct matrix3i B );
  94. extern struct matrix3p mulmm3p( struct matrix3p A, struct matrix3p B );
  95. extern struct vect3i mulmv3i( struct matrix3i A, struct vect3i p );
  96. extern struct vect3p mulmv3p( struct matrix3p A, struct vect3p p );
  97. extern struct vect3i mulmv3pi( struct matrix3p A, struct vect3i p );
  98. /* 3次元vectorの回転 */
  99. extern struct vect3i RotXi( int a, struct vect3i p );
  100. extern struct vect3p RotXp( int a, struct vect3p p );
  101. extern struct vect3i RotYi( int a, struct vect3i p );
  102. extern struct vect3p RotYp( int a, struct vect3p p );
  103. extern struct vect3i RotZi( int a, struct vect3i p );
  104. extern struct vect3p RotZp( int a, struct vect3p p );
  105. extern struct matrix3p RotX( int a );
  106. extern struct matrix3p RotY( int a );
  107. extern struct matrix3p RotZ( int a );
  108. #define Init3M( A )                { (A).xx=0 ; (A).xy=0 ; (A).xz=0 ; (A).yx=0 ; (A).yy=0 ; (A).yz=0 ; (A).zx=0 ; (A).zy=0 ; (A).zz=0 ; }
  109. /* 平面を表す関数 */
  110. #define surffi( s, p )    ( innerpro3i( (s).norl, (p) ) - (s).c )
  111. #define surffp( s, p )    ( innerpro3p( (s).norl, (p) ) - (s).c )
  112.